Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
click to show spoilers.
Note: The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
Java中int
基本型,使用 32位带符号2的补码
来表示正负数。Oracle官方手册上的定义如下:
By default, the int data type is a 32-bit signed two’s complement integer, which has a minimum value of \(-2^{31}\) and a maximum value of \(2^{31}-1\).
2的补码
表示负数的机制如下图,
把一个正数,转换成对应的负数,分两步走,
2的补码的本质是: 一对正负数,二进制加起来,正好进位。
100000000
-00001000 // +8
---------
11111000 // -8
Integer.toString(int i)
可以帮我们做这个int -> String
的转换。为什么不用呢? 然后,String
本身没有reverse()
方法。但StringBuilder
有。倒序之后,再用Integer.parseInt(String s)
,从String
转回int
。这里用long
是为了避免溢出。
public class Solution {
// int -> String -> StringBuilder -> reverse StringBuilder -> long -> int
public int reverse(int x) {
String num = Integer.toString(x); // decode
StringBuilder sb = new StringBuilder(num).reverse(); // reverse
if (sb.charAt(sb.length()-1) == '-') { // negative
sb.deleteCharAt(sb.length()-1);
sb.insert(0,'-');
}
long longX = Long.parseLong(sb.toString()); // encode
return (longX < (long)Integer.MIN_VALUE || longX > (long)Integer.MAX_VALUE)? 0:(int)longX; // overflow
}
}
还不错。
通过x % 10
这样一个简单的计算,可以取出十进制的每一位。代码只有6行,很Q。
public class Solution {
public int reverse(int x) {
long result = 0l;
while(x != 0) {
result = result * 10 + (x % 10);
x = x/10;
}
return (result < (long)Integer.MIN_VALUE || result > (long)Integer.MAX_VALUE)? 0:(int)result; // overflow
}
}
比用String解码稍微快一点。